package com.zlm.tools.util;

import com.zlm.tools.pojo.User;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 深拷贝工具类
 */

public class OrikaMapperUtils {

    private static final MapperFacade mapperFacade;

    static {
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().useAutoMapping(true).mapNulls(true).build();
        mapperFacade = mapperFactory.getMapperFacade();
    }

    /**
     * 深拷贝对象
     * @param from  原对象
     * @param to    目标对象
     * @param <S>   原对象类型
     * @param <D>   目标对象类型
     */
    public static <S, D> void map(S from, D to) {
        mapperFacade.map(from, to);
    }

    /**
     * 深拷贝对象
     * @param from  原对象
     * @param clazz 目标对象类型
     * @param <S>   原对象类型
     * @param <D>   目标对象类型
     */
    public static <S, D> D map(S from, Class<D> clazz) {
        return mapperFacade.map(from, clazz);
    }

    /**
     * 深拷贝集合
     * @param source             原集合
     * @param    目标集合类型
     * @param <S>                原集合类型
     * @param <D>                目标集合类型
     */
    public static <S, D> List<D> mapAsList(Iterable<S> source, Class<D> collectClass) {
        return mapperFacade.mapAsList(source, collectClass);
    }

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("zs", 18));
        list.add(new User("ls", 12));
        list.add(new User("ww", 16));
        List<User> newList = mapAsList(list, User.class);
        User user = newList.get(0);
        user.setName("张三");
        user.setAge(28);
        System.out.println(list);
        System.out.println(newList);
    }

}
